﻿/**
 * \brief TCP任务类
 * \file CTcpTask.h
 */

#ifndef __CTCP__TASK__H
#define __CTCP__TASK__H

#include "CTask.h"
#include "Socket.h"
#include "MsgQueue.h"

const size_t _MAX_CHECK_VERIFY_TIME = 100;
const size_t _MAX_CHECK_SYNC_TIME = 100;

class CTcpTaskPool;

/**
 * \brief TCP连接任务类
 */
class CTcpTask : public CTask
{
	public:
		CTcpTask(int _sockfd, CTcpTaskPool* _pPool);
		virtual ~CTcpTask();

	public:
		/// 加入EPOLL事件
		int addEpoll(int _epollfd, __uint32_t _events, void* _ptr);
		/// 删除EPOLL事件
		int delEpoll(int _epollfd, __uint32_t _events);

	public:
		/// 检测唯一性
		virtual bool vCheckUnique() = 0;
		/// 设置唯一
		virtual void vSetUnique() = 0;

		/// 同步（发送同步消息到同步客户端）
		virtual void vSync() = 0;

		/// 检测验证（等待验证消息发来）
		virtual bool vCheckVerify() = 0;
		/// 检测同步（等待同步消息发来）
		virtual bool vCheckSync() = 0;

		/// 是否可以回收
		virtual bool vCanRecycle() = 0;
		/// 回收动作
		virtual void vRecycle() = 0;

		/// 检测连接信号（检测连接是否有响应的实现）
		virtual bool vCheckConnSignal() = 0;

	public:
		/// 逻辑线程发送数据接口
		void sendCmd(void* _pCmd, int _len);

	public:
		/// 接收数据
		void onRecv();
		/// 发送数据
		void onSend();

		/// 检测验证超时
		bool checkVerifyTimeOut();
		/// 检测同步超时
		bool checkSyncTimeOut();

		/// 是否是终止状态
		bool isTerminal();
		/// 设置为终止状态
		void setTerminal();

	private:
		Socket _M_socket;		/// 套接口
		CTcpTaskPool* _M_pool;		/// 任务池指针

		short _M_checkVerifyTime;	/// 检测验证次数
		short _M_checkSyncTime;		/// 检测同步次数

		bool _M_terminal;		/// 终止状态（客户端退出完成、一段时间无响应会设置为终止状态，等待线程时间片回收）

		MsgQueue<102400> _M_recvMsgQue;	/// 接收消息队列（每个消息队列位于每个TCP连接任务中，好处是不用加锁，因为一个线程代多个任务，一个任务只可能在一个处理线程中）
						/// 逻辑线程为单线程运行，每个TCP任务同时也都属于逻辑线程，逻辑线程本身就是一个定时器，每个时间片遍历所有TCP任务，去处理每个任务消息队列的每个消息。
};

#endif	/// __CTCP__TASK__H

